/*!
 *  \file       IntervalRandomGenerator.cpp
 *  \brief      Implementazione della classe \c IntervalRandomGenerator
 *  \author     Davide Scola <S2299453@studenti.unige.it>
 *  \author	Minetti Alberto <S3064777@studenti.unige.it>
 *  \version    1.0
 */
#include "IEntropyGenerator.hpp"
#include "IRandomGenerator.hpp"
#include "SimpleRandomGenerator.hpp"
#include "NormalizedRandomGenerator.hpp"
#include "IntervalRandomGenerator.hpp"

using namespace std;


/*!
 *  \brief      Costruttore di copia di \c IntervalRandomGenerator
 *  \param[in]	other	generatore da copiare
 */
template < typename tType >
IntervalRandomGenerator< tType >::IntervalRandomGenerator( IntervalRandomGenerator< tType > const& other )
  : NormalizedRandomGenerator< tType >( static_cast< NormalizedRandomGenerator< tType > >( other ) ),
    minRange_( (&other)->minRange_ ),
    maxRange_( (&other)->maxRange_ )
{
}

/*!
 *  \brief      Costruttore di \c IntervalRandomGenerator
 *  \param[in]	min		estremo inferione dell'intervallo
 *  \param[in]	max		estremo superiore dell'intervallo
 *  \param[in]	entropy		generatore di entropia da utilizzare
 */
template < typename tType >
IntervalRandomGenerator< tType >::IntervalRandomGenerator( tType min, tType max, IEntropyGenerator & entropy )
  : NormalizedRandomGenerator< tType >( entropy ),
    minRange_( min ),
    maxRange_( max )
{
  if( this->minRange_ > this->maxRange_ ) {
    swap( this->minRange_, this->maxRange_ );
  }
}

/*!
 *  \brief      Operatore di assegnazione della classe \c IntervalRandomGenerator
 *
 */
template < typename tType > IntervalRandomGenerator< tType >&
IntervalRandomGenerator< tType >::operator=( const IntervalRandomGenerator& other )
{
   if (this == &other) {
       return *this;
   }
   
   this->entropy_ = (&other)->entropy_;
   this->minRange_ = (&other)->minRange_;
   this->maxRange_ = (&other)->maxRange_;
   return *this;
}


/*!
 *  \brief      Ritorna un nuovo numero pseudo-casuale nel range dato
 */
template < typename tType > tType
IntervalRandomGenerator< tType >::next( void )
{
  return ( this->maxRange_ - this->minRange_ ) * 
	  NormalizedRandomGenerator< tType >::next( ) +
	  this->minRange_;
}
